/**
 * 封装 axios 请求模块
 */
import axios from 'axios'
import store from '@/store'
import router from '@/router/index.js'
import { Toast } from 'vant'
import { exchangeTokenAPI } from '@/api/userAPI.js'
import jsonBig from 'json-bigint'

const instance = axios.create({
  baseURL: 'http://toutiao-app.itheima.net', // 基础路径，
  transformResponse: [
    function(data) {
      // 对 data 进行任意转换处理
      if (!data) return ''
      return jsonBig.parse(data)
    }
  ]
})

// axios的请求拦截器
instance.interceptors.request.use(
  function(config) {
    Toast.loading({
      message: '加载中...',
      duration: 0
    })

    const tokenStr = store.state.tokenInfo.token
    if (tokenStr) {
      config.headers.Authorization = 'Bearer ' + tokenStr
    }
    return config
  },
  function(error) {
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  function(response) {
    // 如果接口调用失败，也需要隐藏 loading 效果
    Toast.clear()
    return response
  },
  async function(error) {
    // 如果接口调用失败，也需要隐藏 loading 效果
    Toast.clear()
    // if (error.response && error.response.status === 401) {
    //   router.push('/login')
    // }
    const tokenInfo = store.state.tokenInfo
    if (
      error.response &&
      error.response.status === 401 &&
      tokenInfo.refresh_token
    ) {
      try {
        const { data: res } = await exchangeTokenAPI(tokenInfo.refresh_token)
        console.log(res)
        store.commit('updateTokenInfo', {
          token: res.data.token,
          refresh_token: tokenInfo.refresh_token
        })
        // 在第二个 function 中，return 了一个请求的 Promise 对象
        // 注意：这一行代码我们只能分析过程，但是没有为什么（因为这是 axios 官方提供的用法）
        return instance(error.config)
      } catch (error) {
        store.commit('cleanState')
        router.push('/login')
      }
    }

    return Promise.reject(error)
  }
)

export default instance
